import React from 'react';
import {is} from 'immutable';
class PureComponent extends React.Component{
    //原理是会重写类组件的shouldComponentUpdate方法
    //接收新的属性对象和新的状态对象
    shouldComponentUpdate(nextProps,nextState){
        //把老的属性对象和新的属性对象进行浅比较，如果相等则不更新，如果不想则更新
        //把老的状态对象和新的状态对象进行浅比较，如果相等则不更新，如果不想则更新
        return !shallowEqual(this.props,nextProps)||
        !shallowEqual(this.state,nextState)
    }
}
//Memo其实就是一个高阶组件，参数是老的函数组件,返回一个新组件
function memo(FunctionComponent){
    return class extends PureComponent{
        render(){
            return <FunctionComponent {...this.props}/>
        }
    }
}
function shallowEqual(obj1,obj2){
    //如果obj1和obj2引用地址是一样的，则直接返回true
    if(obj1 === obj2){
        return true;
    }
    //如果有任何一个不是对象或者是null，则认为也不相等
    if(typeof obj1 !=='object' || obj1 === null || typeof obj2 !== 'object'|| obj2===null){
        return false;
    }
    //获取obj1和obj2的属性的长度
    let keys1 = Object.keys(obj1);
    let keys2 = Object.keys(obj2);
    //如果两者长度不相等，则认为两个对象不相等
    if(keys1.length !== keys2.length){
        return false;
    }
    //如果属性的长度也一样，则遍历obj1属性
    for(let key of keys1){
        //如果说obj2里没有包含此属性的话，或者包含了但是两者不相等的话，那就不相等
        if(!obj2.hasOwnProperty(key) || !is(obj1[key],obj2[key])){
            return false;
        }
    }
    //如果说所有的属性都相等，最终就返回true
    return true;
}
export {
    PureComponent,
    shallowEqual,
    memo
}